package com.hhkj.payment.alipay;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayFundTransUniTransferModel;
import com.alipay.api.domain.Participant;
import com.alipay.api.request.AlipayFundTransUniTransferRequest;
import com.alipay.api.response.AlipayFundTransUniTransferResponse;
import com.hhkj.payment.alipay.common.conf.AliPayConf;
import com.ruoyi.common.exception.GlobalException;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;

/**
 * AliPayApi
 *
 * @author HHKJ-SERVER-ZJ
 * @since 2023/11/15 15:12
 */
@Slf4j
public class AliPayApi {

    /**
     * 现金支付功能
     *
     * @param outBizNo            订单好
     * @param remark              备注信息
     * @param participantIdentity 参与方的唯一标识
     * @param participantName     参与方真实姓名
     * @param transAmount         订单总金额，单位为元，精确到小数点后两位，STD_RED_PACKET产品取值范围[0.01,100000000]； TRANS_ACCOUNT_NO_PWD产品取值范围[0.1,100000000]
     * @param orderTitle          转账业务的标题，用于在支付宝用户的账单里显示
     */
    public static AlipayFundTransUniTransferResponse fundTransUniTransfer(String outBizNo, String remark, String participantIdentity, String participantName, String transAmount, String orderTitle) {

        if (!AliPayConf.getIsPro()) {
            // 测试下转账一律为 0.10
            transAmount = "0.10";
        }

        CertAlipayRequest alipayConfig = createCertAlipayRequest();
        AlipayClient alipayClient;
        try {
            alipayClient = new DefaultAlipayClient(alipayConfig);
            AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
            AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
            // 单号
            model.setOutBizNo(outBizNo);
            // 备注
            model.setRemark(remark);
            //转账业务请求的扩展参数，支持传入的扩展参数如下： sub_biz_scene 子业务场景，红包业务必传，取值REDPACKET，C2C现金红包、B2C现金红包均需传入
            model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
            // 描述特定的业务场景，可传的参数如下： DIRECT_TRANSFER：单笔无密转账到支付宝，B2C现金红包; PERSONAL_COLLECTION：C2C现金红包-领红包
            model.setBizScene("DIRECT_TRANSFER");
            // 收款方信息
            Participant payeeInfo = new Participant();
            // 参与方的唯一标识
            payeeInfo.setIdentity(participantIdentity);
            // 参与方的标识类型，目前支持如下类型： 1、ALIPAY_USER_ID 支付宝的会员ID 2、ALIPAY_LOGON_ID：支付宝登录号，支持邮箱和手机号格式 3、ALIPAY_OPEN_ID：支付宝openid
            payeeInfo.setIdentityType("ALIPAY_LOGON_ID");
            // 参与方真实姓名，如果非空，将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时，本字段必填
            payeeInfo.setName(participantName);
            model.setPayeeInfo(payeeInfo);
            // 订单总金额，单位为元，精确到小数点后两位，STD_RED_PACKET产品取值范围[0.01,100000000]； TRANS_ACCOUNT_NO_PWD产品取值范围[0.1,100000000]
            model.setTransAmount(transAmount);
            // 业务产品码， 单笔无密转账到支付宝账户固定为: TRANS_ACCOUNT_NO_PWD； 收发现金红包固定为: STD_RED_PACKET；
            model.setProductCode("TRANS_ACCOUNT_NO_PWD");
            // 转账业务的标题，用于在支付宝用户的账单里显示
            model.setOrderTitle(orderTitle);
            request.setBizModel(model);
            AlipayFundTransUniTransferResponse result = alipayClient.certificateExecute(request);
            log.info(result.toString());
            log.info(result.getBody());
            System.out.println("调用成功");
            return result;
        } catch (AlipayApiException e) {
            throw new GlobalException("发起失败，请刷新后重试");
        }
    }

    @NotNull
    private static CertAlipayRequest createCertAlipayRequest() {
        String privateKey = AliPayConf.getPrivateKey();
        CertAlipayRequest alipayConfig = new CertAlipayRequest();
        // 商户私钥
        alipayConfig.setPrivateKey(privateKey);
        // 网关地址 线上：https://openapi.alipay.com/gateway.do 沙箱：https://openapi.alipaydev.com/gateway.do
        alipayConfig.setServerUrl(AliPayConf.getServerUrl());
        // 开放平台上创建的应用的ID
        alipayConfig.setAppId(AliPayConf.getAppId());
        // 编码
        alipayConfig.setCharset("UTF8");
        // 解密格式
        alipayConfig.setSignType("RSA2");
        //
        alipayConfig.setEncryptor("");
        // 报文格式，推荐：json
        alipayConfig.setFormat("json");
        // 商户应用公钥证书路径（证书模式下设置，公钥模式下无需设置）
        alipayConfig.setCertPath(AliPayConf.getCertPath());
        // 支付宝公钥证书路径（证书模式下设置，公钥模式下无需设置）
        alipayConfig.setAlipayPublicCertPath(AliPayConf.getAlipayPublicCertPath());
        // 支付宝根证书路径（证书模式下设置，公钥模式下无需设置）
        alipayConfig.setRootCertPath(AliPayConf.getRootCertPath());
        return alipayConfig;
    }
}
